| Name | Defense Meteorological Satellite Program (DMSP), Operational Line Scanner(OLS) | Suomi National Polar Orbiting Partnership (NPP), Visible Infrared Imaging Radiometer Suite (VIIRS) |
|---|---|---|
| Satellite | ||
| Availability | 1992 to 2014 | 2011 to Present |
| Spatial Resolution | 1 km | 0.5 km |
| Temporal Resolution | Daily (yearly on GEE) | Daily (monthly on GEE) |
| Radiance Digital Number (DN) | 6 bit numbers (0 - 64) | 7 bit numbers (0 - 128) |
//Use SRTM elevation data to remove pixels that represent oceans
var elev = ee.Image('srtm90_v4');
var elevation_mask = elev.mask();
// --------------------------------
// ----- DMSP ---------------------
// --------------------------------
//Select time
//DMSP is avaiable between 1992 and 2012 (yearly)
var DMSP_T1_a = '1993-01-01';
var DMSP_T1_b = '1993-12-31';
var DMSP_T2_a = '2012-01-01';
var DMSP_T2_b = '2012-12-31';
//Load data
var DMSP = ee.ImageCollection('NOAA/DMSP-OLS/NIGHTTIME_LIGHTS')
.select('stable_lights');
//Transform to Image using .mean as reducer and .updateMask to remove ocean pixels
var DMSP_T1 = DMSP.filterDate(DMSP_T1_a, DMSP_T1_b).mean()
.updateMask(elevation_mask);
var DMSP_T2 = DMSP.filterDate(DMSP_T2_a, DMSP_T2_b).mean()
.updateMask(elevation_mask);
//Calculate change
var DMSP_change = DMSP_T2.subtract(DMSP_T1);
//Display maps
Map.addLayer(DMSP_T1, {min:0, max:64}, 'DMSP T1');
Map.addLayer(DMSP_T2, {min:0, max:64}, 'DMSP T2');
Map.addLayer(DMSP_change, {min:-20, max:20 , palette: ['blue', 'white', 'red']}, 'DMSP T2-T1 rad');
// --------------------------------
// ----- VIRRS --------------------
// --------------------------------
//Select time
//VIRRS is available between 2012 and present (monthly)
var VIIRS_T1_a = '2012-09-01';
var VIIRS_T1_b = '2012-10-31';
var VIIRS_T2_a = '2020-09-01';
var VIIRS_T2_b = '2020-10-31';
//Load data
var VIIRS = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMCFG')
.filterDate('2012-01-01', '2021-12-31')
.select('avg_rad');
// Transform to Image using .mean as reducer and .updateMask to remove ocean pixels
var VIIRS_T1 = VIIRS.filterDate(VIIRS_T1_a, VIIRS_T1_b).mean()
.updateMask(elevation_mask);
var VIIRS_T2 = VIIRS.filterDate(VIIRS_T2_a, VIIRS_T2_b).mean()
.updateMask(elevation_mask);
//Calculate change
var VIIRS_change = VIIRS_T2.subtract(VIIRS_T1);
//Display maps
Map.addLayer(VIIRS_T1, {min:0, max:128}, 'VIIRS T1');
Map.addLayer(VIIRS_T2, {min:0, max:128}, 'VIIRS T2');
Map.addLayer(VIIRS_change, {min:-20, max:20 , palette: ['blue', 'white', 'red']}, 'VIIRS T2-T1');
//*--------------------------------------
//Notes:
//DMSP used 6 bit numbers (0 - 64) while VIIRS usss 7 bit number (0-128)
//The gain for DMSP is high so there will be saturation in bright areas
//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);
//Calculate ROI area in km2
print('ROI Area km2', ROI.geometry().area().divide(1e6));
//DMSP ROI
var DMSP_chart = ui.Chart.image.seriesByRegion(
DMSP,
ROI.geometry(),
ee.Reducer.mean())
.setOptions({title: 'DMSP Night Light Radiance',
hAxis: {title: 'Year',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'Intensity',
minValue: 0},
colors: ['red']});
print(DMSP_chart);
//VIIRS ROI
var VIIRS_chart = ui.Chart.image.seriesByRegion(
VIIRS,
ROI.geometry(),
ee.Reducer.mean())
.setOptions({title: 'VIIRS Night Light Radiance',
hAxis: {title: 'Month',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'Intensity',
minValue: 0},
colors: ['red']});
print(VIIRS_chart);
| Name | National Agriculture Imagery (NAIP) | Sentinel-2 | Landsat (1-9) |
|---|---|---|---|
| Satellite | |||
| Availability | 2006, 2009, 2011, 2013, 2015, 2017, 2019 | 2016 - present | 1999 - present |
| Coverage | Continental US | Global | Global |
| Spatial Resolution | 1 m | 10 m | 30 m |
| Temporal Resolution | Yearly mosaic | 10 days (5 days from 2019) | 16 days |
| Spectral Bands | 4 | 13 | 11 |
| NDVI Bands | R + IR | B4 (665 nm) + B8 (833 nm) | B4 (660 nm) + B5 (860 nm) |
// --------------------------------
// ----- NAIP ---------------------
// --------------------------------
//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);
//Select time
//Yearly mosaics of 2006, 2009, 2011, 2013, 2015, 2017, 2019
var N_T1_a = '2011-01-01';
var N_T1_b = '2011-12-31';
var N_T2_a = '2015-01-01';
var N_T2_b = '2015-12-31';
//Get RGB visual imagery for ROI
var NAIP = ee.ImageCollection('USDA/NAIP/DOQQ').filterBounds(ROI);
var NAIP_T1 = NAIP.filterDate(N_T1_a, N_T1_b).mosaic().clip(ROI);
var NAIP_T2 = NAIP.filterDate(N_T2_a, N_T2_b).mosaic().clip(ROI);
//Plot red, green, and blue bands
Map.addLayer(NAIP_T1, {min: 0, max: 255, bands:['R','G','B']}, 'NAIP T1', 0);
Map.addLayer(NAIP_T2, {min: 0, max: 255, bands:['R','G','B']}, 'NAIP T2', 1);
//Calculate NDVI using red (R) and Near Infrared Band (N)
var NDVI_NAIP_T1 = NAIP_T1.normalizedDifference(['N', 'R']).rename('NDVI_NAIP');
var NDVI_NAIP_T2 = NAIP_T2.normalizedDifference(['N', 'R']).rename('NDVI_NAIP');
//Plot NDVI
Map.addLayer(NDVI_NAIP_T1, {min: -0.4, max: 0.6, palette: ['brown','white', 'green']}, 'NAIP NDVI T1 1m', 0);
Map.addLayer(NDVI_NAIP_T2, {min: -0.4, max: 0.6, palette: ['brown','white', 'green']}, 'NAIP NDVI T2 1m', 1);
//Plot NDVI histogram between T1 and T2
var NDVI_T1_T2 = NDVI_NAIP_T1.addBands(NDVI_NAIP_T2);
var ndvi_naip = ui.Chart.image.histogram({
image: NDVI_T1_T2,
region: ROI,
scale: 3,
maxPixels: 1e13})
.setSeriesNames(['NAIP T1', 'NAIP T2'])
.setOptions({title: 'NAIP NDVI Histograms for T1 and T2',
hAxis: {title: 'NDVI',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'Count',
titleTextStyle: {italic: false, bold: true}},
colors: ['cf513e', '1d6b99'],
opacity:[0.1,0.2]});
print(ndvi_naip);
// --------------------------------
// ----- Sentinel -----------------
// --------------------------------
//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);
//Select time
//Revisit time of 10 days 2016-2018, 5 days 2019-present
var S_T1_a = '2016-5-01';
var S_T1_b = '2016-9-30';
var S_T2_a = '2020-5-01';
var S_T2_b = '2020-9-30';
//Function to mask clouds using the detected cloud band "QA60"
var maskcloud_s2 = function(image) {
var QA60 = image.select(['QA60']);
return image
.updateMask(QA60.lt(1));
};
//Get RGB visual imagery for ROI
var sentinel = ee.ImageCollection('COPERNICUS/S2')
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)) // filter to only less cloudy images
.filterBounds(ROI)
.map(maskcloud_s2); // apply the function to all images
//Use median instead of mosaic to ensure that the low lying clouds are removed
var sentinel_T1 = sentinel.filterDate(S_T1_a,S_T1_b).median().clip(ROI);
var sentinel_T2 = sentinel.filterDate(S_T2_a,S_T2_b).median().clip(ROI);
//Plot red (B4), green (B3), and blue (B2) bands
Map.addLayer(sentinel_T1 ,{bands:['B4','B3','B2'], min:0,max:2500}, 'Sentinel 2 T1', 0);
Map.addLayer(sentinel_T2 ,{bands:['B4','B3','B2'], min:0,max:2500}, 'Sentinel 2 T2', 0);
//Calculate NDVI using red (B4) and Near Infrared Band (B8)
var ndvi_sentinel_t1 = sentinel_T1.normalizedDifference(['B8', 'B4']).rename('NDVI_Sentinel');
var ndvi_sentinel_t2 = sentinel_T2.normalizedDifference(['B8', 'B4']).rename('NDVI_Sentinel');
Map.addLayer(ndvi_sentinel_t1, {min:-0.3, max:0.8, palette: ['brown', 'white', 'green']}, 'Sentinel 2 NDVI T1 10m', 0);
Map.addLayer(ndvi_sentinel_t2, {min:-0.3, max:0.8, palette: ['brown', 'white', 'green']}, 'Sentinel 2 NDVI T2 10m', 0);
//Plot NDVI histogram between T1 and T2
var NDVI_T1_T2 = ndvi_sentinel_t1.addBands(ndvi_sentinel_t2);
var ndvi_sentinel = ui.Chart.image.histogram({
image: NDVI_T1_T2,
region: ROI,
scale: 10,
maxPixels: 1e13})
.setSeriesNames(['SENTINEL T1', 'SENTINEL T2'])
.setOptions({title: 'SENTINEL 2 NDVI Histograms for T1 and T2',
hAxis: {title: 'NDVI',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'Count',
titleTextStyle: {italic: false, bold: true}},
colors: ['cf513e', '1d6b99']});
print(ndvi_sentinel);
// --------------------------------
// ----- LANDSAT ------------------
// --------------------------------
//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);
//Select time
//Revisit time of 16 days 1999 - present
var L_T1_a = '2003-5-01';
var L_T1_b = '2003-9-30';
var L_T2_a = '2015-5-01';
var L_T2_b = '2015-9-30';
//Function to mask clouds
var maskcloud_L = function(image) {
var qa = image.select('pixel_qa');
// If the cloud bit (5) is set and the cloud confidence (7) is high
// or if the cloud shadow bit is set (3), then it's a bad pixel.
var cloud = qa.bitwiseAnd(1 << 5)
.and(qa.bitwiseAnd(1 << 7))
.or(qa.bitwiseAnd(1 << 3));
// Remove edge pixels that don't occur in all bands
var mask2 = image.mask().reduce(ee.Reducer.min());
return image.updateMask(cloud.not()).updateMask(mask2);
};
//Get RGB visual imagery for ROI
var landsat = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR').map(maskcloud_L).filterBounds(ROI);
var landsat_T1 = landsat.filterDate(L_T1_a,L_T1_b).median().clip(ROI);
var landsat_T2 = landsat.filterDate(L_T2_a,L_T2_b).median().clip(ROI);
//Plot red (B3), green (B2), and blue (B1) bands
Map.addLayer(landsat_T1 ,{bands:['B3','B2','B1'], min:0,max:2500}, 'Landsat 7 T1', 0);
Map.addLayer(landsat_T2 ,{bands:['B3','B2','B1'], min:0,max:2500}, 'Landsat 7 T2', 0);
//Calculate NDVI using red (B3) and Near Infrared Band (B4)
var landsat_ndvi_t1 = landsat_T1.normalizedDifference(['B4', 'B3']).rename('NDVI_Landsat_T1');
var landsat_ndvi_t2 = landsat_T2.normalizedDifference(['B4', 'B3']).rename('NDVI_Landsat_T2');
Map.addLayer(landsat_ndvi_t1, {min:-0.15, max:0.7, palette: ['brown', 'white', 'green']}, 'Landsat NDVI T1 30m', 0);
Map.addLayer(landsat_ndvi_t2, {min:-0.15, max:0.7, palette: ['brown', 'white', 'green']}, 'Landsat NDVI T2 30m', 0);
//Plot NDVI histogram between T1 and T2
var NDVI_T1_T2 = landsat_ndvi_t1.addBands(landsat_ndvi_t2);
var ndvi_landsat = ui.Chart.image.histogram({
image: NDVI_T1_T2,
region: ROI,
scale: 30,
maxPixels: 1e13})
.setSeriesNames(['LANDSAT T1', 'LANDSAT T2'])
.setOptions({title: 'LANDSAT NDVI Histograms for T1 and T2',
hAxis: {title: 'NDVI',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'Count',
titleTextStyle: {italic: false, bold: true}},
colors: ['cf513e', '1d6b99'],
opacity:0});
print(ndvi_landsat);
//NDVI calculation for timeseries
var ndvi_func = function (i) {
var ndvi = i.normalizedDifference (['B4', 'B3']).rename ('NDVI');
return i.addBands(ndvi);
};
var ndvi_landsat = landsat.map(ndvi_func).filterDate('2000-01-01','2020-12-31');
var timeseries = ui.Chart.image.seriesByRegion({
imageCollection: ndvi_landsat,
regions: ROI,
reducer: ee.Reducer.mean(),
band: 'NDVI',
scale: 30})
.setOptions({title: 'LANDSAT 7 - NDVI',
hAxis: {title: 'Year',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'NDVI',
titleTextStyle: {italic: false, bold: true}},
colors: ['red']});
print(timeseries);
| Name | Moderate Resolution Imaging Spectroradiometer (MODIS) on board Aqua and Terra | Thermal Infrared Sensor (TIRS) on board Landsat-8 |
|---|---|---|
| Satellite | ||
| Spatial Resolution | 1 km | 30 m |
| Temporal Resolution | daily, but provided in 8 days aggregates | 16 days |
| Collection Time | ~11:30 am and ~11:30 pm local time | ~10:30 am local time |
// --------------------------------
// ----- MODIS --------------------
// --------------------------------
//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);
//Select time
var T1 = "2016-07-01";
var T2 = "2016-07-10";
//Create heat palette
var pal = ['040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
'0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
'3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
'ff0000', 'de0101', 'c21301', 'a71001', '911003'];
//Function to convert K to C
function celcius_modis(img){
return img.multiply(0.02).subtract(273.15)
.rename(['modis_day_celcius', 'modis_night_celcius'])
.copyProperties(img, img.propertyNames());
}
//Load data (MODIS/MOD11A2 for pre-2017)
var modis = ee.ImageCollection('MODIS/MOD11A2')
.filterDate(T1 , T2)
.select(['LST_Day_1km', 'LST_Night_1km'])
.map(celcius_modis);
//Separate day and night
var modis_day = modis.select('modis_day_celcius').mean().clip(ROI);
var modis_night = modis.select('modis_night_celcius').mean().clip(ROI);
Map.addLayer(modis_day, {min:20, max:40 , palette: pal}, 'Modis Day');
Map.addLayer(modis_night, {min:20, max:40 , palette: pal}, 'Modis Night');
//Load another collection (MODIS/006/MOD11A2 for 2000-present)
var modis_chart = ee.ImageCollection('MODIS/006/MOD11A2')
.filterDate('2010-01-01', '2021-12-31')
.select(['LST_Day_1km','LST_Night_1km'])
.map(celcius_modis);
//Create timeseries for day (red) and night (blue)
var heat_time = ui.Chart.image.series({
imageCollection: modis_chart,
region: ROI,
reducer: ee.Reducer.mean(),
scale: 1000})
.setOptions({title: 'MODIS DAY & NIGHT (celcius)',
hAxis: {title: 'Year',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'Temperature (°C)',
titleTextStyle: {italic: false, bold: true}},
colors: ['red', 'blue']});
print(heat_time);
// --------------------------------
// ----- LANDSAT ------------------
// --------------------------------
//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);
//Select time
var T1 = "2016-07-01";
var T2 = "2016-07-10";
//Create heat palette
var pal = ['040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
'0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
'3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
'ff0000', 'de0101', 'c21301', 'a71001', '911003'];
//Function applying scalling and offset factor
function celcius_landsat(img){
return img.addBands(img.multiply(0.00341802) // scale
.add(149.0) // offset
.subtract(273.15)
.rename('landsat_day_celcius'));
}
//Load data, selecting images with less than 15% cloud cover
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filter(ee.Filter.lt('CLOUD_COVER',15))
.select('ST_B10')
.map(celcius_landsat)
.select('landsat_day_celcius');
//Filter by date (T1 - T2)
var landsat_day = landsat.filterDate(T1,T2).mean().clip(ROI);
Map.addLayer(landsat_day, {min:20, max:45 , palette: pal}, 'Landsat Day');
//Plot time series
var landsat_chart = landsat.filterDate('2010-01-01', '2021-12-31');
var landsat_time = ui.Chart.image.series({
imageCollection: landsat_chart,
region: ROI,
reducer: ee.Reducer.max(),
scale: 1000})
.setOptions({title: 'LANDSAT DAY (celcius)',
hAxis: {title: 'Year',
titleTextStyle: {italic: false, bold: true}},
vAxis: {title: 'Temperature (°C)',
titleTextStyle: {italic: false, bold: true}},
colors: ['red']});
print(landsat_time);
// --------------------------------
// ----- Profile Line -------------
// --------------------------------
//Create a point profile line
function getRange(start, end, step) {
var range = [];
while (step > 0 ? end >= start : end <= start) {
range.push(start);
start += step;
}
return range;
}
var y = 40.6809; // the latitude of the profile line
var x1 = -74.0119; // the longitude of profile line beginning point
var x2 = -73.7325; // the longitude of profile line end point
var N = 1000; // the number of samples on the profile line
//Get coordinate points
var R = getRange(x1,x2,(x2-x1)/N);
//Transform coordinates into a FeatureCollection
var points = ee.FeatureCollection( R.map(function(i){
var point = ee.Geometry.Point([ee.Number(i), ee.Number(y)]) // create a new point feature with R[i] as longitude and y as latitude
return(ee.Feature(point).set({
lon:ee.Number(i), // add attributes lon
lat:ee.Number(y) // add attributes lat
}))
}))
Map.addLayer(points, {}, 'points');
//Stack all bands
var stack = modis_day
.addBands([modis_night, landsat_day])
.rename(['modis_day', 'modis_night', 'landsat_day']);
//Get temperature at each point
var collection = stack.reduceRegions({
reducer: ee.Reducer.max(),
collection: points,
scale: 1});
//Plot a scatter plot of the Modis profile line
var chart = ui.Chart.feature.byFeature({
features: collection,
xProperty: 'lon', // use longitude as the X axis
yProperties: ['modis_day','modis_night']}) // use Temperature as the y axis
.setChartType('ScatterChart')
.setOptions({title: 'Temperature Profile Line Modis',
hAxis: {title: 'Longitude',
titleTextStyle: {italic: false, bold: true},
viewWindow: {min: x1, max: x2}}, // x axis limit to start & end of the line
vAxis: {title: 'Temperature (°C)',
titleTextStyle: {italic: false, bold: true}},
pointSize: 1,
colors: ['red', 'blue']});
print(chart);
//Plot a scatter plot of the Landsat profile line
var chart = ui.Chart.feature.byFeature({
features: collection,
xProperty: 'lon', // use longitude as the X axis
yProperties: ['landsat_day']}) // use Temperature as the y axis
.setChartType('ScatterChart')
.setOptions({title: 'Temperature Profile Line Landsat',
hAxis: {title: 'Longitude',
titleTextStyle: {italic: false, bold: true},
viewWindow: {min: x1, max: x2}}, // x axis limit to start & end of the line
vAxis: {title: 'Temperature (°C)',
titleTextStyle: {italic: false, bold: true}},
pointSize: 1,
colors: [ 'orange']});
print(chart);
Synthetic Aperture Radar (SAR) uses microwaves meaning it is weather independent (i.e., clouds have no impact) and can be collected during the day or the night.
| Copernicus (TerraSAR-X & TanDEM-X) | Shuttle Radar Topography Mission (SRTM) | Advanced Land Observing Satellite (ALOS) |
|---|---|---|
| Worldwide at 30m planar resolution | Worldwide at 30m planar resolution | Worldwide at 30m planar resolution |
| 2019 | 2000 | 2012 |
Surface Roughness and Backscattering
The strength of the return, or backscatter, is partially based upon relative roughness of the surface imaged. The smoother the surface, the more reflection away from the sensor, while rough surfaces give a much stronger return towards the imaging platform.
However, there are additional types of bounce mechanisms beyond specular and diffuse. In vegetation, volumetric scattering occurs when signals bounce around inside the vegetation imaged. In urban areas, the double bounce mechanism causes a strong bounce back to the sensor.
Wavelength
The wavelength of the SAR system influences the amount of ground penetration that occurs. X-band has the least penetration, scattering from the top of the canopy in vegetated areas. All three bands will penetrate dry sand, with stronger returns from both C-band and L-band. L-band has the most penetration overall, with returns from the ground in vegetated areas, strong returns from substances under dry alluvium, and deep penetration of ice and snow.
Polarization
Polarization refers to the direction of travel of an electromagnetic wave. A horizontal wave is transmitted so that it oscillates in a plane parallel to the surface imaged, while a vertical wave oscillates in a plane perpendicular to the surface imaged. There are four different polarization combinations commonly used by SAR sensors: VV, VH, HV and HH. The first letter indicates the polarization used to transmit the signal and the second letter indicates the polarization of the measured return. Polarimetry is an emerging field of SAR processing, used in a number of applications such as measuring vegetation properties, oceanography, geology, and disaster response.
// --------------------------------
// ----- SURFACE CLASSIFICATION ---
// --------------------------------
// ----- SET UP -------------------
// ROA for Bangladesh Flood
var centerX = 91.103909, centerY = 24.64874;
var post_start = '2016-07-18';
var post_end = '2016-07-30';
var pre_start= '2016-01-30';
var pre_end = '2016-03-30';
var width_roi = 1.5, height_roi = 1;
var width_plot = 0.01, height_plot = 0.01;
// Set a bounding box for image
var box = ee.Geometry.Rectangle([centerX+width_roi, centerY+height_roi,
centerX-width_roi, centerY-height_roi]);
// Set a bounding box for time series plot
var roi_plot = ee.Geometry.Rectangle([centerX+width_plot, centerY+height_plot,
centerX-width_plot, centerY-height_plot]);
Map.setCenter(centerX, centerY, 5);
// ----- SAR DATA -----------------
/*
1. instrumentMode = IW means Interferometric Wide Swath; a process of capturing data
2. transmitterReceiverPolarisation = polarization of the signal; use VV or HH
* VV = verticle transmit and verticle receive
* HH = horizontal transmission and horizontal receive
We generally use VV for flood detection and Urban change detection because it
appears dark for water and brighter for settlement.
3. orbitProperties_pass = the direction of the satellite with respect to earth;
chose either DESCENDING or ASCENDING
*/
var collectionVV = ee.ImageCollection('COPERNICUS/S1_GRD')
.filter(ee.Filter.eq('instrumentMode', 'IW'))
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
.select(['VV'])
.filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));
// ----- CALCULATIONS -------------
//Select one image from each month
var before = ee.Image(collectionVV.filterDate(pre_start, pre_end).mean().clip(box));
var after = ee.Image(collectionVV.filterDate(post_start, post_end).mean().clip(box));
//Subtact backscatter value of each month with March 2015
var diff = before.subtract(after).clip(box);
//var diff = (before.subtract(after.abs()).clip(box)
//Mask changes
var cumulative_mask_l = (diff.abs()).gt(4);
var SAR_masked = diff.abs().updateMask(cumulative_mask_l);
// Plot
Map.addLayer(box, {}, 'ROI for change detection');
Map.addLayer(roi_plot, {}, 'ROI for timeseries plot');
Map.addLayer(before, {min: -15, max: 0}, 'SAR_pre');
Map.addLayer(after, {min: -15, max: 0}, 'SAR_post');
Map.addLayer(SAR_masked, {min: -10, max: -7, palette: ['red']}, 'SAR_Change_detection');
| RADAR | SONAR | LIDAR |
|---|---|---|
| Radio Detection and Ranging | Sound Navigation and Ranging | Light Detection and Ranging |
| Uses radio waves | Uses sound waves | Uses lasers/infrared waves |
| Used for air traffic control and speed detection | Used to measure the ocean flood and located submarines | Used in autonomous driving and elevation detection |
| Digital Surface Model (DSM) | Digital Elevation Model (DEM) |
|---|---|
| Captures both the natural and built/artificial features of the environment | Represents the bare-Earth surface, removing all natural and built features. A Digital Terrain model (DTM) augments a DEM by including vector features of the natural terrain, such as rivers and ridges. |
// --------------------------------
// ----- SURFACE MODEL ------------
// --------------------------------
// Create ROI
var lon = -73.949580, lat = 40.612130;
var width = 0.05, height = 0.01;
var ROI = ee.Geometry.Rectangle([lon+width, lat+height,
lon-width, lat-height]);
Map.centerObject(ROI, 13);
// ----- COPERNICUS DSM -----------
// Copernicus Glo-30 DSM created from 2016 Sentinel 1 dataset (SAR)
var copernicus_dsm = ee.ImageCollection('projects/sat-io/open-datasets/GLO-30')
.mosaic()
.setDefaultProjection('EPSG:3857', null, 30);
Map.addLayer(copernicus_dsm, {min: 0, max: 50.0}, 'Copernicus DSM 30m');
// ----- SRTM DSM -----------------
// DSM from the Shuttle Radar Topography Mission (SRTM) from 2000 (SAR)
// Fill in the masked water area by using .unmask()
var srtm_dsm = ee.Image('CGIAR/SRTM90_V4')
.select('elevation')
.unmask();
Map.addLayer(srtm_dsm, {min: 0, max: 50.0}, 'SRTM DSM 90m');
// ----- ALOS DSM -----------------
// ALOS World 3D by JAXA collected between 2006-2011 (SAR)
var alos_dsm = ee.Image('JAXA/ALOS/AW3D30/V2_2')
.select('AVE_DSM');
Map.addLayer(alos_dsm, {min: 0, max: 50.0}, 'ALOS DSM 30m');
// ----- USGS DEM ----------
// LiDAR-based DEM from the USGS 3D Elevation Program
var usgs_3dep_dem = ee.Image('USGS/3DEP/10m');
Map.addLayer(usgs_3dep_dem, {min: 0, max: 50.0}, 'USGS 3DEP DEM 10m');
// --------------------------------
// ----- PROFILE LINE -------------
// --------------------------------
// Create a line based on lat long
function getRange(start, end, step) {
var range = [];
while (step > 0 ? end >= start : end <= start) {
range.push(start);
start += step;
}
return range;
}
var y = 40.6116; //latitude of the profile line
var x1 = -74.1988; //longitude of profile line beginning point
var x2 = -73.7325; //longitude of profile line end point
var N = 2000; //number of samples on the profile line
// Apply the function to get the coordinate points
var R = getRange(x1,x2,(x2-x1)/N);
// Transform coordinates into a FeatureCollection
var points = ee.FeatureCollection(R.map(function(i){
var point = ee.Geometry.Point([ee.Number(i), ee.Number(y)]);
return(ee.Feature(point).set({
lon:ee.Number(i),
lat:ee.Number(y)
}));
}));
Map.addLayer(points, {color:'red'}, 'points');
// Get values at each point and stack the images into a single image
var stack = srtm_dsm
.addBands([usgs_3dep_dem, alos_dsm , copernicus_dsm])
.rename(['DSM SRTM', 'DEM USGS','DSM ALOS', 'DSM Copernicus']);
// Get value at each points and store them as a column
var collection = stack.reduceRegions({
reducer: ee.Reducer.max(),
collection: points,
scale: 1});
// Compare ALOS, SRTM Copernicus, and USGS
var chart = ui.Chart.feature.byFeature({
features: collection,
xProperty: 'lon',
yProperties: ['DEM USGS', 'DSM Copernicus', 'DSM SRTM', 'DSM ALOS']})
.setChartType('LineChart')
.setOptions({title: 'Elevation ALOS, Copernicus DSM vs USGS',
hAxis: {title: 'Longitude',
titleTextStyle: {italic: false, bold: true},
viewWindow: {min: x1, max: x2}},
vAxis: {title: 'Elevation (m)',
titleTextStyle: {italic: false, bold: true}},
series: {0: {lineWidth: 2, color: 'red'},
1: {lineWidth: 2, color: 'green'},
2: {lineWidth: 4, color: 'orange'},
3: {lineWidth: 4, color: 'blue'}
}});
print(chart);
Skyview Factor
The Clean Air Act requires EPA to set National Ambient Air Quality Standards (NAAQS) for six common air pollutants (also known as “criteria air pollutants”). These pollutants are found all over the U.S. They can harm your health and the environment, and cause property damage.
| Pollutant | Common Sources | Maximum Acceptable Concentration | Environmental Risks | Human Health Risks |
|---|---|---|---|---|
| Carbon Monoxide (CO) | Automobile emissions, fires, industrial processes | 35 ppm (1-hour period); 9 ppm (8-hour period) | Contributes to smog formation | Exacerbates symptoms of heart disease, such as chest pain; may cause vision problems and reduce physical and mental capabilities in healthy people |
| Nitrogen Oxides (NO and NO2) | Automobile emissions, electricity generation, industrial processes | 0.053 ppm (1-year period) | Contributes to acid rain formation, which subsequently damages foliage, buildings, and monuments; reacts to form particulate matter; contributes to smog formation | Inflammation and irritation of breathing passages |
| Sulfur Dioxide (SO2) | Electricity generation, fossil-fuel combustion, industrial processes, automobile emissions | 0.03 ppm (1-year period); 0.14 ppm (24-hour period) | Major cause of haze; contributes to acid rain formation, which subsequently damages foliage, buildings, and monuments; reacts to form particulate matter | Breathing difficulties, particularly for people with asthma and heart disease |
| Ozone (O3) | Nitrogen oxides (NOx) and volatile organic compounds (VOCs) from industrial and automobile emissions, gasoline vapors, chemical solvents, and electrical utilities | 0.075 ppm (8-hour period) | Interferes with the ability of certain plants to respire, leading to increased susceptibility to other environmental stressors (e.g., disease, harsh weather) | Reduced lung function; irritation and inflammation of breathing passages |
| Particulate matter | Sources of primary particles include fires, smokestacks, construction sites, and unpaved roads; sources of secondary particles include reactions between gaseous chemicals emitted by power plants and automobiles | 150 μg/m3 (24-hour period for particles <10 μm); 35 μg/m3 (24-hour period for particles <2.5 μm) | Contributes to formation of haze as well as acid rain, which changes the pH balance of waterways and damages foliage, buildings, and monuments | Irritation of breathing passages, aggravation of asthma, irregular heartbeat |
| Lead (Pb) | Metal processing, waste incineration, fossil-fuel combustion | 0.15 μg/m3 (rolling three-month average); 1.5 μg/m3 (quarterly average) | Loss of biodiversity, decreased reproduction, neurological problems in vertebrates | Adverse effects upon multiple bodily systems; may contribute to learning disabilities when young children are exposed; cardiovascular effects in adults |
Remote Sensing
Ground-based Sensors
The Gridded Population of the World, (GPWv4)
| Observations | Count | Density |
|---|---|---|
//Load data
var pop_collection = ee.ImageCollection("CIESIN/GPWv411/GPW_UNWPP-Adjusted_Population_Count")
.select('unwpp-adjusted_population_count');
//Choose date range
var T1_start = '2000-01-01';
var T1_ends = '2000-12-31';
var T2_start = '2020-01-01';
var T2_ends = '2020-12-31';
//Pull population for date range
var T1_pop = pop_collection.filterDate(T1_start, T1_ends).first();
var T2_pop = pop_collection.filterDate(T2_start, T2_ends).first();
//Calculate population change
var T2T1_pop_change = T2_pop.subtract(T1_pop);
//Plot
Map.setCenter(-74.0060, 40.7128, 9); //New York, United States
Map.addLayer(T1_pop, {min: 0, max: 2000, palette: [ 'ffffff', 'red' ]}, 'Population T1');
Map.addLayer(T2_pop, {min: 0, max: 2000, palette: [ 'ffffff', 'red' ]}, 'Population T2');
Map.addLayer(T2T1_pop_change, { min:-300, max: 300, palette: ['blue','black','red']}, 'Pop Change T1-T2');
//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);
//Summary statistics
var changeStats = T2T1_pop_change.reduceRegion(
{reducer: ee.Reducer.mean()
.combine({reducer2: ee.Reducer.stdDev(), sharedInputs: true})
.combine({reducer2: ee.Reducer.percentile({percentiles:[25,50,75]}), sharedInputs: true})
.combine({reducer2: ee.Reducer.count(), sharedInputs: true}),
geometry: ROI.geometry()});
print(changeStats);
//Plot total population
var pop_total = ui.Chart.image.series(
pop_collection,
ROI,
ee.Reducer.sum()) //.mean() can be used for denisty
.setOptions({title: 'Total Population of NYC',
vAxis: {textStyle: {fontSize: 14}},
hAxis: {title: 'Year', format: 'yyyy', gridlines: {count: 7},
titleTextStyle: {italic: false, bold: true, fontSize:14},
textStyle: {fontSize: 14}}});
print(pop_total);